package com.lost.octopus.es.helper.entity.wrapper;

import com.lost.octopus.es.helper.entity.model.FieldConfig;
import com.lost.octopus.es.helper.builder.FieldMatchBuilders;
import com.lost.octopus.es.helper.constant.EsMatchType;

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;

/**
 * 抽象es查询对象包装类,实现后需要设置为springBean
 * @author zhangbh
 **/
public interface QueryWrapper {

    /**
     * 返回当前需要构造的结构化对象，方便其他Wrapper复用
     * 直接使用{@link #addWrapper}的返回值会多一层 boolean嵌套
     * @param field 查询字段对象
     * @return 返回当前Wrapper处理的QueryBuilder，提供给外部扩展使用,为空则无此查询 如{@link EsQueryMultiplyValPrefixWrapper}
     */
    default QueryBuilder useWrapper(FieldConfig field) {
        return addWrapper(QueryBuilders.boolQuery(), field);
    }

    /**
     * 根据不同类型，构建不同的查询条件
     * 内置支持匹配类型 {@link EsMatchType} 可以使用 {@link FieldMatchBuilders#useBuilder}
     * @param builder 构建对象，实现时，需要将内部查询条件放入
     * @param field 查询字段对象
     * @return 返回当前Wrapper处理的QueryBuilder，提供给外部扩展使用,为空则无此查询 如{@link EsQueryMultiplyValPrefixWrapper} 会多出一层外层嵌套
     */
    QueryBuilder addWrapper(BoolQueryBuilder builder, FieldConfig field);
}
